package com.kaifamiao.calendar;

import java.util.Calendar;
import java.util.Date;

public class DateHelper {

    private static final DateHelper helper = new DateHelper();

    private static final String[] DAYS = { "周日", "周一", "周二", "周三", "周四", "周五", "周六" };

    private DateHelper(){
        super();
    }

    public static DateHelper getInstance() {
        return helper;
    }

    /**
     * 根据指定的 年份、月份、月份中的日期 返回一个与之对应的 Date实例
     * @param year 表示年份
     * @param month 表示月份(按照中国人的做法从1开始)
     * @param date 表示月份中的日期
     * @return 返回指定年月日对应的Date实例
     */
    public Date produce(int year, int month, int date ) {
        if( month < 1 || month > 12 ) {
            throw new IllegalArgumentException( "月份必须是1到12之间的数字" );
        }
        if( date < 1 || date > 31 ) {
            throw new IllegalArgumentException( "月份中的日期必须是1到31之间的数字" );
        }
        Calendar c = Calendar.getInstance();
        c.clear();
        c.set( year,month-1, date );
        Date d = c.getTime();
        return d;
    }

    /**
     * 根据给定的Date实例获得与之相应的字符串形式
     * @param date 表示Date实例
     * @return 返回中国人读得懂的日期时间格式
     */
    public String format( Date date ) {

        if( date == null ) {
            throw new IllegalArgumentException( "参数不可为空" );
        }

        Calendar c = Calendar.getInstance();
        c.setTime(date);

        int year = c.get( Calendar.YEAR );

        int month =  c.get( Calendar.MONTH ) + 1;
        String mon = padLeft( month, 2 );

        int dayOfMonth =  c.get( Calendar.DATE );
        String d = padLeft( dayOfMonth, 2 );

        int week = c.get( Calendar.DAY_OF_WEEK );
        String w = DAYS[ week - 1 ];

        int hourOfDay =  c.get( Calendar.HOUR_OF_DAY );
        String h = padLeft( hourOfDay, 2 );

        int minutes =  c.get( Calendar.MINUTE );
        String min = padLeft( minutes, 2 );

        int seconds =  c.get( Calendar.SECOND );
        String sec = padLeft( seconds, 2 );

        int millis = c.get( Calendar.MILLISECOND );
        String ms = padLeft( millis, 3 );

        return String.format( "%d年%s月%s日 %s %s:%s:%s.%s" , year, mon, d, w, h, min, sec, ms );
    }

    /**
     * 将整数补够指定的位数(在高位补零后返回字符串形式)
     * @param num 待处理的整数
     * @param length 确定方法执行后所返回字符串的最大长度
     * @return
     */
    private String padLeft( int num , int length ){
        // 将整数转换为字符串形式
        String s = String.valueOf( num );
        // 计算需要在高位上所补充的零的个数
        int p = length - s.length();
        // 在字符串开始补充p个零
        String t = "0".repeat(p) + s ;
        // 返回目标字符串
        return t ;
    }

    public static void main(String[] args) {
        DateHelper dh = DateHelper.getInstance();

        Date date = dh.produce( 2022, 8, 18 );
        System.out.println( date );

        String str = dh.format(date);
        System.out.println( str );
    }

}
